// 自动导入组件的通用工具方法

import {defineAsyncComponent} from "vue";

const import_function_map = import.meta.glob(`./*/*.vue`);

const import_function_group_map = {}
Object.keys(import_function_map).forEach(path=>{
    let path_info = path.split('/');
    let name = path_info.pop().replace('.vue', '');
    if (name.indexOf('_') === 0) return;
    let dir = path_info.pop();
    import_function_group_map[dir] = import_function_group_map[dir] || {}
    import_function_group_map[dir][name] = import_function_map[path];
})

console.log(import_function_group_map, '自动导入的组件')

/**
 * 返回异步组件枚举，用于门户组件批量引入组件使用
 * @param {string} dir 需要导入的 vue 组件存放目录
 * @returns {{}}
 */
export function defineAsyncComponentMap(dir){
    let function_map = import_function_group_map[dir] || {};
    let res = {}
    Object.keys(function_map).forEach(name => {
        res[name] = defineAsyncComponent(function_map[name]);
    })
    return res;
}

/**
 * 获取组件枚举
 * @param {string} dir 需要导入的 vue 组件存放目录
 * @returns { Promise<{[componentName:string]: Object}> }
 */
export function componentMap(dir){
    let function_map = import_function_group_map[dir] || {};
    return Promise.all(Object.values(function_map).map(func=>func())).then(component_list=>{
        let name_list = Object.keys(function_map);
        let res = {}
        component_list.forEach((row,i)=>{
            let name = name_list[i];
            res[name] = row.default;
        })
        return res;
    })
}